#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//堆中处理结构体数组的指针成员
struct man
{
    char *name;
    int age;
    int classid;
};


int main()
{
    struct man *p = calloc(10, sizeof(struct man));
    //在堆中分配了10个man
    int i;
    for(i = 0; i < 10; i++)
    {
        printf("please input name:");
        //作用是，给name分配一个合适的内存空间
        char tmp[1024] = { 0 };//定义一个空的数组，大小1024char
        scanf("%s", tmp);//获取这个char数组的字符串，也就是name
        p[i].name = malloc(strlen(tmp) + 1);//给name分配一个输入的name大小+1的堆空间
        strcpy(p[i].name, tmp);//把tmp字符串，也就是获取的name的字符串拷贝给name的堆空间

        printf("please input age:");
        scanf("%d", &p[i].age);

        printf("please input chassid:");
        scanf("%d", &p[i].classid);
    }

    for (i = 0; i < 10; i++)
    {
        printf("%s, %d, %d\n", p[i].name, p[i].age, p[i].classid);
    }

    //先释放离散的name空间
    for(i = 0; i < 10; i++)
    {
        free(p[i].name);
    }

    //最后释放p空间
    //释放堆中连续的空间，（就是堆中的数组)
    free(p);
    return 0;
}

